数学 : 外積(クロス積)
ベクトルの外積
ベクトル $ \vec{A} , $ \vec{B} のなす角を$ \theta 、$ \vec{A} の長さを $ |A| , $ \vec{B} の長さを $ |B| とおくと、以下が成り立つ。
$ \vec{A} \cdot \vec{B} = |A|・|B| \cdot sin \theta
外積(2次元)
ベクトル$ \vec{A} = \binom{x_1}{y_1}, \vec{B} = \binom{x_2}{y_2}の外積$ \vec{A} \times \vec{B}は以下のように計算できる。
$ \vec{A} \times \vec{B} = \binom{x_1}{y_1} \times \binom{x_2}{y_2} = {x_1}{y_2} - {x_2}{y_1}
ベクトルの外積は、2つのベクトルが作る平行四辺形の面積に等しいという性質を持つ
例) ベクトル(2,0) とベクトル(0,1)の外積を計算してみる
$ (2,0) \times (0,1) = 2 \cdot 1 - 0 \cdot 0 = 2
ベクトル $ \vec{A} , $ \vec{B} が作る平行四辺形の面積は2に等しいことが分かる。
https://gyazo.com/72d6192bb23dcbea0f03f93028e6143d
外積(3次元)
ベクトル$ \vec{A} = \begin{pmatrix} {x_1} \\\ {y_1} \\\ {z_1} \end{pmatrix}, \vec{B} = \begin{pmatrix} {x_2} \\\ {y_2} \\\ {z_2} \end{pmatrix}の外積$ \vec{A} \times \vec{B}は以下のように計算できる。
$ \vec{A} \times \vec{B} = \begin{pmatrix} {x_1} \\ {y_1} \\ {z_1} \end{pmatrix} \times \begin{pmatrix} {x_2} \\ {y_2} \\ {z_2} \end{pmatrix} = \begin{pmatrix} {y_1}{z_2} - {z_1}{y_2} \\ {z_1}{x_2} - {x_1}{z_2} \\ {x_1}{y_2} - {x_2}{y_1} \end{pmatrix}
例) ベクトル(2, 0, 0) とベクトル(0, 3, 0)の外積を計算してみる
$ \begin{pmatrix} 2 \\ 0 \\ 0 \end{pmatrix} \times \begin{pmatrix} 0 \\ 3 \\ 0 \end{pmatrix} = \begin{pmatrix} 0 \\ 0 \\ 6 \end{pmatrix}
x軸上のベクトル(2, 0, 0) とy軸上のベクトル(0, 3, 0)の外積をとるとz軸上のベクトル(0, 0, 6)になることが分かる
外積の利用例 : 三角形と点の内外判定
三角形と外積
外積の利用例 : Curl Noise(カールノイズ)
カールノイズはベクトル場 $ \bm{A} に対して回転(rot)を適用して計算できる。
$ rot \bm{A} = \nabla \times \bm{A}
カールノイズのカール(Curl)は回転を意味する言葉
カールノイズの特徴
渦巻いて見える
流体の発散がゼロになる(divergence-free)
Perlin noise is the earliest form of lattice noise, which has become very popular in computer graphics. Perlin Noise is not suited for simulation because it is not divergence-free.
Noises based on lattices, such as simulation noise and Perlin noise, are often calculated at different frequencies and summed together to form band-limited fractal signals.
Other approaches developed later that use vector calculus identities to produce divergence free fields, such as "Curl-Noise" as suggested by Robert Bridson, and "Divergence-Free Noise" due to Ivan DeWolf. These often require calculation of lattice noise gradients, which sometimes are not readily available. A naive implementation would call a lattice noise function several times to calculate its gradient, resulting in more computation than is strictly necessary. Unlike these noises, simulation noise has a geometric rationale in addition to its mathematical properties. It simulates vortices scattered in space, to produce its pleasing aesthetic.
lattice noise : 格子状で計算するノイズ
gradient : 勾配
参考リンク
UnityのCompute ShaderでCurl Noiseを実装(流体編)
Curl Noise書いてみた
ベクトル解析の基本 発散 勾配 回転
HoudiniDops - Prisms